#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110;
const double eps = 1e-6;

int n;
double n[N][N];
int gauss()
{
    int c, r; // c列 r行
    for (c = 0, r = 0; c < n; c++)
    {
        int t = r; // t指向c列数最大的一行
        for (int i = r; i < n; i++)
            if (fabs(a[i][c]) > fabs(a[t][c]))
                t = i;

        if (!fabs(a[t][c]) < eps) // 当前行为0
            continue;

        for (int i = 0; i <= n; i++) // 将最大的一行挪到最上面
            swap(a[t][i], a[r][i]);

        for (int i = n; i >= 0; i--) // 最大行的首元素变为1
            a[r][i] /= a[r][c];

        for (int i = r + 1; i < n; i++)      // 消去其他行的元素
            if (fabs(a[i][c]) > eps)         // 其他行元素非0
                for (int j = n; j >= c; j--) // 下面行的每个被影响的元素-r行原对应列元素*影响列的对应列元素
                    a[i][j] -= a[r][j] * a[i][c];
        r++;
    }
    if (r < n)
    {
        for (int i = r; i < n; i++)
            if (fabs(a[i][n]) > eps) // 即存在0*x不等于0的状况
                return 2;            // 无解
        return 1;                    // 存在0*x=0的情况，x可以为任意解，即无限组解
    }

    for (int i = n - 1; i >= 0; i--) // 把每一行后面的系数都消为0
        for (int j = i + 1; j < n + 1; j++)
            a[i][n] -= a[i][j] * a[j][n]; // 每一行最后-消去列*对应消去行最后

    return 0;
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n + 1; j++)
            cin >> a[i][j]; // 输入线性方程组

    int t = gauss();
    if (t == 0) // 只有一组解
        for (int i = 0; i < n; i++)
            print("%.2lf\n", a[i][n]);
    else if (t == 1) // 无限组解
        puts("Infinite group solutions");
    else // 无解
        puts("No solution");
    return 0;
}